home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr50 / qbmenu10.zip / QBMENU!.BAS < prev    next >
BASIC Source File  |  1993-06-21  |  28KB  |  994 lines

  1. ' =================================================================
  2. ' >>>>>>>> QBMenu! 1.0
  3. ' <<<<<<<< (C) Copyright Victor Yiu, 1993.
  4. ' >>>>>>>> released February 9, 1993
  5. ' =================================================================
  6.  
  7. DECLARE SUB FlipTog (Position%)
  8. DECLARE SUB Clock ()
  9. DECLARE SUB Alarm ()
  10. DECLARE SUB Center (Dummy%, Text$)
  11. DECLARE SUB ClearBot ()
  12. DECLARE SUB DrawTop (State%, Choice%)
  13. DECLARE SUB DrawBox (StartX%, StartY%, EndX%, EndY%, Border%, Fill%, Shadow%)
  14. DECLARE SUB Initialize ()
  15. DECLARE SUB Info (Line1$, Line2$)
  16. DECLARE SUB ModBG (Row%, Col%, Wid%, High%, State%)
  17. DECLARE SUB Ok (X%, Y%, FCol%, BCol%, JustDraw%, Help25%)
  18. DECLARE SUB ShowLogo (Offset%)
  19. DECLARE SUB WaitFor (Leng%)
  20. DECLARE FUNCTION AltOn% ()
  21. DECLARE FUNCTION GetSubM$ ()
  22. DECLARE FUNCTION Let2Scan% (Letter%)
  23. DECLARE FUNCTION Main$ ()
  24.  
  25. DEFINT A-Z     ' integers default
  26.  
  27. CONST False = 0, True = NOT False   ' boolean
  28. CONST RegF = 7, RegB = 0, RevF = 0, RevB = 7
  29. CONST HighF = 15, HighB = 7, HighN = 0
  30. CONST Closed = 1, Pressed = 2, Released = 3, Opened = 4, Search = -1
  31.  
  32. COMMON SHARED bBG%, ColorM%, VidSeg%, MonoVGA%
  33.  
  34. ' $INCLUDE: 'SaveScrn.Bi'
  35.  
  36. DIM SHARED ProgName$, Help25%, Toggle$
  37. DIM SHARED FalseAlt%, OldSta%, LastState%, PrevState%, Bar%
  38. DIM SHARED LeftK$, RightK$, Up$, Down$
  39. DIM SHARED Enter$, Null$, Escape$, Blank$
  40.  
  41. Initialize
  42.  
  43. COLOR 7, 0
  44. CLS
  45. COLOR 7, bBG
  46. FOR BackGr = 2 TO 24
  47.     LOCATE BackGr, 1
  48.     PRINT STRING$(80, 177);
  49. NEXT
  50.  
  51. COLOR 7, 1
  52. Logo$ = "QBMenu! 1.0 ■ Victor Yiu ■ Fake app: just type a key... █ "
  53. Logo$ = Logo$ + Logo$ + Logo$: ShiftPos = 2
  54. ShowLogo 1
  55.  
  56. COLOR 7, 0
  57. DrawBox 17, 3, 23, 78, 1, 32, 1
  58. COLOR 12, 0
  59. Center 18, "This is a sample menu from one of my software releases, WSMaker."
  60. Center 19, "Try Option│Alphabetize -- it's a toggle! In fact, I put in 4 togs!"
  61. Center 20, "Both PTable and WSMaker use a variation of this menu system."
  62. COLOR 13, 0
  63. Center 21, "Do you like it or hate it?  Have a comment or suggestion?  Want"
  64. Center 22, "to include it in your app.?  Just send me some mail..."
  65.  
  66. DrawTop Closed, 0
  67. DO
  68.     In$ = Main      ' just pertend that Main is INKEY$ and use it.  It will
  69.                     ' return the SAME results.  The difference is that Main
  70.                     ' will allow the user to pull down them menu!
  71.     SELECT CASE In$
  72.         CASE Escape$, Null$ + "k", Null$ ' Alt+F4 - escape: exit
  73.          Info "Thank you for trying QBMenu!", "(C) Copyright Victor Yiu, 1993."
  74.             COLOR 7, 0
  75.             CLS
  76.             END
  77.         CASE ELSE
  78.             ShowLogo ShiftPos
  79.             ShiftPos = (ShiftPos MOD 58) + 1
  80.     END SELECT
  81. LOOP
  82.  
  83. LOCATE 1, 1, 1
  84. COLOR 15, 0
  85. CLS
  86. END
  87.  
  88. ' ==============================
  89. MainMenu:
  90.  
  91. ' use a "^" in front of a letter to make it the HOTKEY
  92.  
  93.     DATA 4
  94.         '^  # of menus
  95.     DATA ^File
  96.     DATA ^Edit
  97.     DATA ^Options
  98.     DATA ^Help
  99.  
  100. FileDATA:
  101.     DATA 2, 15
  102.       ' ^^^  co-ordinate for start box (row, col)
  103.       '  v - how many lines long?
  104.     DATA 8, 22
  105.     '       ^ - longest entry (the width of menu)
  106.     DATA 0
  107.         '^ how many toggles?
  108.  
  109.     DATA ^New Puzzle
  110.     DATA ^Open Puzzle...      F9
  111.     DATA ^Save               F10
  112.     DATA Save ^As...   Shift+F10
  113.     DATA ":
  114.     DATA ^Print...            F8
  115.     DATA ":
  116.     DATA E^xit            Alt+F4
  117.  
  118. EditDATA:
  119.     DATA 2, 21
  120.     DATA 6, 37
  121.     DATA 0
  122.     DATA ^Correct a Word...                  F3
  123.     DATA ^Remove a Word...             Shift+F3
  124.     DATA ":
  125.     DATA ^Move a Word to a New Position...   F4
  126.     DATA ":
  127.     DATA Edit ^Title...                      F5
  128.  
  129. OptionDATA:
  130.     DATA 2,27
  131.     DATA 10, 28
  132.      '   +-------- total number of 'toggle entries' to read
  133.      '   |  +----- position in toggle$
  134.      '   v  v  v-- position in toggle$
  135.     DATA 7, 1, 2, 3, 0, 0, 0, 4
  136.         ' put a "0" for a menu choice that doesn't have a toggle.
  137.         ' so if you have 3 menu choices, the 1st and 3rd are toggles,
  138.         ' you would write:
  139.         '         DATA 3, 1, 0, 2
  140.         ' that is assuming that the 'toggles' represent the 1st and 2nd
  141.         ' positions of the common shared string Toggle$ (that represents
  142.         ' the current state of the toggles.)
  143.  
  144.     DATA ^Alphabetize Words
  145.     DATA ^Easy Puzzle
  146.     DATA ^Confirm on Word Remove
  147.     DATA ":
  148.     DATA Save ^Options as Default   F7
  149.     DATA ":
  150.     DATA Auto ^Screensaver
  151.     DATA ^Test Screensaver          F6
  152.     DATA ":
  153.     DATA Send ^Form Feed to Printer
  154.  
  155. HelpDATA:
  156.     DATA 2, 32
  157.     DATA 4, 33
  158.     DATA 0
  159.  
  160.     DATA ^How to use WSMaker 2.0         F1
  161.     DATA ^Command line parameters   Ctrl+F1
  162.     DATA ":
  163.     DATA A^bout WSMaker 2.0        Shift+F1
  164.  
  165. Let2ScanDATA:   ' do not change, please.
  166.     DATA 4
  167.     DATA 16,QWERTYUIOP[]
  168.     DATA 30,ASDFGHJKL;'
  169.     DATA 44,ZXCVBNM./
  170.     DATA 120,1234567890-=
  171.  
  172. SUB Alarm
  173.  
  174. SOUND 880, 1
  175. SOUND 700, 1
  176. DO: LOOP UNTIL LEN(INKEY$) = 0
  177.  
  178. END SUB
  179.  
  180. FUNCTION AltOn
  181.  
  182. DEF SEG = 0     ' bottom of mem.
  183. IF (PEEK(1047) AND 8) THEN AltOn = True ELSE AltOn = False  ' check for alt
  184. DEF SEG         ' return to current segment
  185.  
  186. END FUNCTION
  187.  
  188. SUB Center (Dummy, Text$)
  189.  
  190. IF LEN(Text$) = 80 THEN
  191.     LOCATE Dummy, 1
  192. ELSE
  193.     LOCATE Dummy, (82 - LEN(Text$)) \ 2
  194. END IF
  195. PRINT Text$;
  196.  
  197. END SUB
  198.  
  199. SUB ClearBot
  200.  
  201. LOCATE 25, 1
  202. IF ColorM THEN COLOR 15, 3 ELSE COLOR 0, 7
  203. PRINT SPACE$(80);
  204.  
  205. END SUB
  206.  
  207. SUB Clock STATIC
  208. IF OldTime$ <> TIME$ THEN
  209.     OldTime$ = TIME$
  210.  
  211.     HourZ = VAL(TIME$)
  212.     IF HourZ > 12 THEN
  213.         T$ = MID$(STR$(HourZ - 12), 2) + MID$(TIME$, 3) + "pm"
  214.     ELSE
  215.         T$ = TIME$
  216.         IF LEFT$(T$, 1) = "0" THEN MID$(T$, 1) = Blank$
  217.         IF HourZ = 0 THEN T$ = "12" + MID$(T$, 3)
  218.         IF HourZ < 12 THEN T$ = T$ + "am" ELSE T$ = T$ + "pm"
  219.     END IF
  220.  
  221.     LOCATE 1, 68, 0
  222.     COLOR 0, 7
  223.     PRINT CHR$(179); Blank$;
  224.     IF ColorM THEN COLOR 15, 7
  225.     PRINT T$;
  226. END IF
  227.  
  228. END SUB
  229.  
  230. SUB DrawTop (State, Choice)
  231.  
  232. IF SCREEN(1, 3) <> 66 THEN    ' first time init.
  233.     LOCATE 1, 1
  234.     IF ColorM THEN COLOR 15, 4 ELSE COLOR 15, 0
  235.     PRINT Blank$; LEFT$(ProgName$, 11); Blank$;
  236.     COLOR 7, 0
  237.     PRINT STRING$(81 - POS(0), 219);
  238. END IF
  239.  
  240. RESTORE MainMenu
  241.  
  242. IF State <> Search THEN
  243.     LOCATE 1, 14
  244.     COLOR RevF, RevB
  245.     PRINT "   ";
  246. END IF
  247.  
  248. READ Num
  249.  
  250. SELECT CASE State
  251.     CASE Closed
  252.  
  253.         FOR Dummy = 1 TO Num
  254.             READ A$
  255.             IF Dummy = Num THEN LOCATE , 62: PRINT Blank$;
  256.  
  257.             HighWhere = INSTR(A$, Carrot$)
  258.             IF HighWhere <= 0 THEN
  259.                 PRINT A$; "  ";
  260.             ELSE
  261.               PRINT LEFT$(A$, HighWhere - 1); MID$(A$, HighWhere + 1); Blank$;
  262.                 IF Dummy <> Num THEN PRINT Blank$;
  263.             END IF
  264.         NEXT
  265.  
  266.     CASE Pressed
  267.  
  268.         FOR Dummy = 1 TO Num
  269.             READ A$
  270.             HighWhere = INSTR(A$, Carrot$)
  271.             IF HighWhere <= 0 THEN HighWhere = LEN(A$) + 1
  272.  
  273.             IF Dummy = Num THEN LOCATE , 63
  274.  
  275.             COLOR RevF, RevB
  276.             PRINT LEFT$(A$, HighWhere - 1);
  277.             COLOR HighF, HighB
  278.             PRINT MID$(A$, HighWhere + 1, 1);
  279.             COLOR RevF, RevB
  280.             PRINT MID$(A$, HighWhere + 2); Blank$;
  281.             IF Dummy <> Num THEN PRINT Blank$;
  282.         NEXT
  283.     CASE Released
  284.  
  285.         FOR Dummy = 1 TO Num
  286.             READ A$
  287.  
  288.             HighWhere = INSTR(A$, Carrot$)
  289.             IF HighWhere <= 0 THEN HighWhere = LEN(A$) + 1
  290.  
  291.             IF Dummy = Num THEN LOCATE , 62: COLOR RevF, RevB: PRINT Blank$;
  292.             IF Choice = Dummy THEN
  293.                 LOCATE , POS(0) - 1
  294.                 COLOR RegF, RegB
  295.                 PRINT Blank$;
  296.  
  297.                 PRINT LEFT$(A$, HighWhere - 1);
  298.                 COLOR HighF, HighN
  299.                 PRINT MID$(A$, HighWhere + 1, 1);
  300.                 COLOR RegF, RegB
  301.                 PRINT MID$(A$, HighWhere + 2); Blank$;
  302.                 IF Dummy <> Num THEN PRINT CHR$(219);
  303.             ELSE
  304.                 COLOR RevF, RevB
  305.                 PRINT LEFT$(A$, HighWhere - 1);
  306.                 COLOR HighF, HighB
  307.                 PRINT MID$(A$, HighWhere + 1, 1);
  308.                 COLOR RevF, RevB
  309.                 PRINT MID$(A$, HighWhere + 2); Blank$;
  310.                 IF Dummy <> Num THEN PRINT Blank$;
  311.             END IF
  312.  
  313.         NEXT
  314.  
  315.     CASE Opened
  316.  
  317.         FOR Dummy = 1 TO Num
  318.             READ A$
  319.             HighWhere = INSTR(A$, Carrot$)
  320.             IF HighWhere <= 0 THEN HighWhere = LEN(A$) + 1
  321.  
  322.             IF Dummy <> Choice THEN
  323.                 COLOR RevF, RevB
  324.                 IF Dummy = Num THEN
  325.                     LOCATE , 62
  326.     PRINT Blank$; LEFT$(A$, HighWhere - 1); MID$(A$, HighWhere + 1); Blank$;
  327.                 ELSE
  328.     PRINT LEFT$(A$, HighWhere - 1); MID$(A$, HighWhere + 1); "  ";
  329.                 END IF
  330.             ELSE
  331.                 IF Dummy = Num THEN LOCATE , 63
  332.                 COLOR RegF, RegB
  333.                 LOCATE , POS(0) - 1
  334.     PRINT Blank$; LEFT$(A$, HighWhere - 1); MID$(A$, HighWhere + 1); Blank$;
  335.                 IF Dummy <> Num THEN PRINT CHR$(219);
  336.             END IF
  337.         NEXT
  338.  
  339.     CASE Search
  340.  
  341.         Choice = Choice AND 223 ' ucase it
  342.         Found = False
  343.  
  344.         FOR Dummy = 1 TO Num
  345.             READ A$
  346.             HighWhere = INSTR(A$, Carrot$)
  347.  
  348.             IF HighWhere > 0 THEN
  349.                 IF ASC(UCASE$(MID$(A$, HighWhere + 1, 1))) = Choice THEN
  350.                     Found = Dummy
  351.                     EXIT FOR
  352.                 END IF
  353.             END IF
  354.         NEXT
  355.  
  356.         IF Found THEN Choice = Dummy ELSE Choice = 0
  357.  
  358.         EXIT SUB
  359. END SELECT
  360.  
  361. IF (LastState <> State) AND (State <> Search) THEN
  362.     ClearBot
  363.     SELECT CASE State
  364.         CASE Closed
  365.             Dummy$ = "Hold down <Alt> to open menu, <F1> for help, "
  366.             Center 25, Dummy$ + "directional keys to scroll list"
  367.         CASE Pressed
  368.             Center 25, "Press highlighted letter of menu or release <Alt> key"
  369.         CASE Released
  370.             Dummy$ = "Use arrow keys to navigate, a letter "
  371.             Center 25, Dummy$ + "or <Enter> to display menu, <Esc> to cancel"
  372.         CASE Opened
  373.             Dummy$ = "Use arrow keys to navigate, a letter "
  374.             Center 25, Dummy$ + "or <Enter> to execute, <Escape> to cancel"
  375.         CASE ELSE
  376.     END SELECT
  377.  
  378.     Dummy$ = ""
  379.     LastState = State
  380. END IF
  381.  
  382. COLOR 7, bBG
  383.  
  384. END SUB
  385.  
  386. SUB FlipTog (Position)
  387.  
  388. IF ASC(MID$(Toggle$, Position)) <> 0 THEN
  389.     MID$(Toggle$, Position) = Null$
  390. ELSE
  391.     MID$(Toggle$, Position) = Blank$
  392. END IF
  393.  
  394. END SUB
  395.  
  396. FUNCTION GetSubM$
  397.  
  398. ' returns:   X (Null$ if succesful)  X (number selected)
  399.               '(Escape$ if abort)
  400.               '("<" or ">", for left and right respectively)
  401.     QuitLoop = False
  402.     Cursor = 1
  403.  
  404.     READ StX, StY, Length, Longest
  405.     REDIM HighLight(1 TO Length), Scan(1 TO Length), ReturnVal$(1 TO Length)
  406.  
  407.     Tog$ = STRING$(Length, 0)' internal tog, one for each one of elements,
  408.                              ' not "shared" one, when each blank is pre-set to
  409.     READ Togs                ' different elements in different sub-menus.
  410.     IF Togs > 0 THEN
  411.         FOR Dummy = 1 TO Togs
  412.             READ TogPosition
  413.             IF TogPosition <> 0 THEN
  414.                 MID$(Tog$, Dummy) = MID$(Toggle$, TogPosition, 1) 'not Null$
  415.             END IF                                ' if toggled
  416.         NEXT
  417.     END IF
  418.  
  419.     IF ColorM THEN
  420.         Dummy = Snatch(Saved(), StX, StY, StX + Length + 2, StY + Longest + 5, Save)
  421.     ELSE
  422.        Dummy = Snatch(Saved(), StX, StY, StX + Length + 1, StY + Longest + 3, Save)
  423.     END IF
  424.  
  425.     COLOR RevF, RevB
  426.     DrawBox StX, StY, StX + Length + 1, StY + Longest + 3, 1, 32, 1
  427.         '   startX,   End X,       StartY, vv,   1 liner, fill with 32
  428.                                     ' EndY (longest)
  429.     StartPos = StY + 2
  430.     SCol = StY + 1
  431.     Wid = Longest + 2
  432.     NextChoice = 1
  433.  
  434.     FOR Dummy = 1 TO Length
  435.         READ Dummy$
  436.  
  437.         IF ASC(Dummy$) <> 58 THEN
  438.             HighLight(Dummy) = INSTR(Dummy$, "^")
  439.             IF HighLight(Dummy) > 0 THEN
  440.                 Scan(Dummy) = ASC(UCASE$(MID$(Dummy$, HighLight(Dummy) + 1)))
  441.             END IF
  442.             COLOR 0, 7
  443.  
  444.             IF ASC(MID$(Tog$, Dummy, 1)) THEN
  445.                 LOCATE StX + Dummy, SCol
  446.                 PRINT CHR$(4);
  447.             ELSE
  448.                 LOCATE StX + Dummy, StartPos
  449.             END IF
  450.  
  451.             PRINT LEFT$(Dummy$, HighLight(Dummy) - 1); MID$(Dummy$, HighLight(Dummy) + 1);
  452.             ReturnVal$(Dummy) = CHR$(NextChoice)
  453.             NextChoice = NextChoice + 1
  454.         ELSE
  455.             LOCATE StX + Dummy, StY
  456.             PRINT CHR$(195); STRING$(Wid, 196); CHR$(180);
  457.         END IF
  458.     NEXT
  459.  
  460.     Cursor = 1: OldC = 1
  461.     Attr = HighB * 16 + HighF
  462.  
  463.     DEF SEG = VidSeg
  464.     Dummy = StX * 160 + SCol + SCol + 159
  465.     FOR X = 2 TO Length
  466.      IF LEN(ReturnVal$(X)) THEN POKE Dummy + HighLight(X) + HighLight(X), Attr
  467.         Dummy = Dummy + 160
  468.     NEXT
  469.     DEF SEG
  470.  
  471.     Wid = Longest + 1
  472.     ModBG StX + Cursor, SCol, Wid, HighLight(Cursor), 1
  473.  
  474.     Hold = AltOn
  475.     DO
  476.         GOSUB CheckKey
  477.         IF QuitLoop THEN EXIT DO
  478.  
  479.         IF (OldC <> Cursor) THEN
  480.             ModBG StX + Cursor, SCol, Wid, HighLight(Cursor), 1
  481.             ModBG StX + OldC, SCol, Wid, HighLight(OldC), 0
  482.             OldC = Cursor
  483.         END IF
  484.     LOOP
  485.  
  486. Finish:
  487.     IF Okay THEN
  488.         GetSubM$ = Null$ + ReturnVal$(Cursor)
  489.                 '    number             sucessful
  490.     END IF
  491.  
  492.     ' pop-down
  493.     Dummy = Snatch(Saved(), 0, 0, 0, 0, Rest)
  494. EXIT FUNCTION
  495.  
  496. CheckKey:
  497.     DO
  498.         Alt = AltOn
  499.         IF PrevAlt AND (NOT Alt) THEN
  500.             IF NOT Hold THEN
  501.                 GetSubM$ = Escape$: QuitLoop = True: RETURN
  502.             ELSE
  503.                 Hold = False
  504.             END IF
  505.         END IF
  506.         PrevAlt = Alt
  507.  
  508.         I$ = INKEY$
  509.         Clock
  510.     LOOP UNTIL LEN(I$)
  511.  
  512.     SELECT CASE I$
  513.         CASE LeftK$
  514.             GetSubM$ = "<" + Null$' left
  515.             QuitLoop = True: RETURN
  516.         CASE RightK$
  517.             GetSubM$ = ">" + Null$' right
  518.             QuitLoop = True: RETURN
  519.         CASE Up$
  520.             DO
  521.                 Cursor = Cursor - 1
  522.                 IF Cursor < 1 THEN Cursor = Length
  523.             LOOP UNTIL LEN(ReturnVal$(Cursor))   ' not :
  524.         CASE Down$
  525.             DO
  526.                 Cursor = Cursor + 1
  527.                 IF Cursor > Length THEN Cursor = 1
  528.             LOOP UNTIL LEN(ReturnVal$(Cursor))     ' not :
  529.         CASE Escape$
  530.             GetSubM$ = Escape$ + Null$' abort
  531.             QuitLoop = True: RETURN
  532.         CASE Enter$
  533.             Okay = True
  534.             QuitLoop = True: RETURN
  535.         CASE ELSE   ' look for scan
  536.             IF LEN(I$) = 1 THEN
  537.                 Dummy = ASC(UCASE$(I$)): Start = Cursor
  538.                 Cursor = 1
  539.  
  540.                 DO
  541.                     IF HighLight(Cursor) > 0 THEN
  542.                         IF Scan(Cursor) = Dummy THEN   ' found
  543.                             Okay = True
  544.                             EXIT DO
  545.                         END IF
  546.                     END IF
  547.                     Cursor = Cursor + 1
  548.                 LOOP UNTIL Cursor > Length
  549.  
  550.                 IF NOT Okay THEN Alarm: Cursor = Start ELSE QuitLoop = True
  551.             ELSE
  552.                 Dummy = ASC(RIGHT$(I$, 1)): Temp = Cursor
  553.                 Cursor = 1
  554.  
  555.                 DO
  556.                     IF HighLight(Cursor) > 0 THEN
  557.                         IF Let2Scan(Scan(Cursor)) = Dummy THEN
  558.                             Okay = True  ' to enable trap for "successful"
  559.                             EXIT DO
  560.                         END IF
  561.                     END IF
  562.  
  563.                     Cursor = Cursor + 1
  564.                 LOOP UNTIL Cursor = Length
  565.  
  566.                 IF NOT Okay THEN Alarm: Cursor = Temp ELSE QuitLoop = True
  567.             END IF
  568.     END SELECT
  569. RETURN
  570.  
  571. END FUNCTION
  572.  
  573. SUB Info (Line1$, Line2$)
  574.  
  575. IF LEN(Line2$) THEN
  576.     Line2 = True
  577.     IF LEN(Line2$) > LEN(Line1$) THEN
  578.         MaxLen = LEN(Line2$)
  579.     ELSE
  580.         MaxLen = LEN(Line1$)
  581.     END IF
  582. ELSE
  583.     MaxLen = LEN(Line1$)
  584. END IF
  585. MaxLen = MaxLen + 4
  586. IF MaxLen < 40 THEN MaxLen = 40
  587. Start = 40 - MaxLen \ 2
  588. Right = 80 - Start
  589.  
  590. Dummy = Snatch(Saved%(), 25, 1, 25, 80, Save)
  591. Dummy = Snatch(Saved%(), 9, Start, 17 - Line2, Right + 2, Save)
  592. IF ColorM THEN COLOR 15, 3 ELSE COLOR 0, 7
  593. DrawBox 9, Start, 16 - Line2, Right, 2, 32, 1
  594. Center 9, "╡ Information ╞"
  595.  
  596. Center 11, Line1$
  597. IF Line2 THEN Center 12, Line2$
  598. Ok 13 - Line2, 38, 15, 0, 0, 1
  599.  
  600. Dummy = Snatch(Saved(), 0, 0, 0, 0, Rest)
  601. Dummy = Snatch(Saved(), 0, 0, 0, 0, Rest)
  602.  
  603. END SUB
  604.  
  605. SUB Initialize
  606.  
  607. LOCATE 1, 1, 0
  608. PRINT Blank$
  609.  
  610. DEF SEG = 0
  611. ColorM = (PEEK(&H410) AND 48) <> 48
  612. DEF SEG
  613. IF ColorM THEN VidSeg = &HB800 ELSE VidSeg = &HB000
  614.  
  615. Null$ = CHR$(0): BackSpace$ = CHR$(8): Tab$ = CHR$(9)
  616. Enter$ = CHR$(13): Escape$ = CHR$(27): Blank$ = " "   ' space
  617. Up$ = Null$ + "H": Down$ = Null$ + "P"
  618. LeftK$ = Null$ + "K": RightK$ = Null$ + "M"
  619.  
  620. Dummy = Let2Scan(0)  ' initialize it.
  621.  
  622. ' =========================
  623. ' Change your PROGRAM NAME here!
  624. ProgName$ = "QBMenu! 1.0"
  625. ' =========================
  626.  
  627. Toggle$ = SPACE$(4)
  628. MenuSysBy$ = "(C) Copyright Victor Yiu, 1993."
  629.  
  630. IF ColorM = 0 THEN
  631.     DEF SEG = &HB000
  632.     Dummy = PEEK(0)
  633.     IF PEEK(0) <> 89 THEN POKE 0, 89
  634.     IF (SCREEN(1, 1) <> 89) THEN VidSeg = &HB800: MonoVGA = True
  635.     DEF SEG
  636. END IF
  637. bBG = -ColorM       ' blue background
  638.  
  639. Dummy = Snatch(Saved(), 0, 0, 0, MonoVGA, 10) ' initialize Snatch
  640.  
  641. END SUB
  642.  
  643. FUNCTION Let2Scan (Letter) STATIC
  644.  
  645. IF Init = 0 THEN
  646.     RESTORE Let2ScanDATA
  647.     READ Num
  648.  
  649.     DIM Keys$(1 TO Num), Scans(1 TO Num)
  650.  
  651.     FOR Init = 1 TO Num
  652.         READ Scans(Init), Keys$(Init)
  653.     NEXT
  654.     IF Letter = 0 THEN EXIT FUNCTION
  655. END IF
  656.  
  657. T$ = UCASE$(CHR$(Letter))
  658. FOR Find = 1 TO Num
  659.     Dummy = INSTR(Keys$(Find), T$)
  660.     IF Dummy THEN
  661.         Scans = Scans(Find) + Dummy - 1
  662.         EXIT FOR
  663.     END IF
  664. NEXT
  665.  
  666. IF Scans = 0 THEN PRINT "Scan not found": BEEP: END
  667.  
  668. Let2Scan = Scans
  669.  
  670. END FUNCTION
  671.  
  672. FUNCTION Main$
  673.  
  674.     Ex$ = Null$ + CHR$(10)
  675.     Cursor = 1: OldCur = 1
  676.     State = Closed
  677.  
  678.     RESTORE MainMenu
  679.     READ MainMChoices
  680.     DO
  681.         DO
  682.             IF State <> OldSta THEN DrawTop State, Cursor
  683.  
  684.             Alt = AltOn
  685.             IF Hold THEN IF NOT Alt THEN Hold = False: OldAlt = False
  686.  
  687.             IF FalseAlt THEN
  688.                 IF Alt THEN Alt = False ELSE FalseAlt = False
  689.             END IF
  690.  
  691.             IF Alt THEN
  692.                 IF (NOT OldAlt) AND (State = Closed) THEN
  693.                     IF NOT Hold THEN
  694.                         DrawTop Pressed, Cursor
  695.                         State = Pressed
  696.                     END IF
  697.                 END IF
  698.             END IF
  699.  
  700.             IF OldAlt THEN
  701.                 IF (NOT Alt) AND (OldSta <> Opened) THEN
  702.                     IF NOT Hold THEN
  703.                         IF (State <> Closed) AND (State <> Pressed) THEN
  704.                             DrawTop Closed, 0
  705.                             State = Closed
  706.                         ELSE
  707.                             Cursor = 1
  708.                             DrawTop Released, Cursor
  709.                             State = Released
  710.                         END IF
  711.                     END IF
  712.                 END IF
  713.             END IF
  714.  
  715.             IF OldCur <> Cursor THEN  ' moved
  716.                 IF State = Opened THEN
  717.                     DrawTop Opened, Cursor
  718.                 ELSEIF State = Released THEN
  719.                     DrawTop Released, Cursor
  720.                 END IF
  721.                 OldCur = Cursor
  722.             END IF
  723.  
  724.             IF Alt <> OldAlt THEN OldAlt = Alt
  725.             OldSta = State
  726.             In$ = INKEY$
  727.             Clock
  728.         LOOP UNTIL LEN(In$)
  729.         K$ = In$
  730.  
  731.         SELECT CASE In$
  732.             CASE RightK$
  733.                 IF State = Released THEN
  734.                     Cursor = Cursor + 1
  735.                     IF Cursor > MainMChoices THEN Cursor = 1
  736.                 ELSE
  737.                     EXIT DO
  738.                 END IF
  739.  
  740.             CASE LeftK$
  741.                 IF State = Released THEN
  742.                     Cursor = Cursor - 1
  743.                     IF Cursor < 1 THEN Cursor = MainMChoices
  744.                 ELSE
  745.                     EXIT DO
  746.                 END IF
  747.  
  748.             CASE Enter$, Blank$, Down$, Up$
  749.                 IF State = Released THEN
  750.                     GOSUB ActSub
  751.                 ELSE
  752.                     FalseAlt = True
  753.                     EXIT DO
  754.                 END IF
  755.  
  756.             CASE Escape$
  757.                 IF State <> Closed THEN
  758.                     State = Closed
  759.                 ELSE
  760.                     EXIT DO
  761.                 END IF
  762.  
  763.             CASE ELSE
  764.                 Found = False
  765.  
  766.                 IF LEN(In$) = 2 THEN
  767.                     RESTORE MainMenu
  768.                     READ Num
  769.  
  770.                     Dummy = ASC(RIGHT$(In$, 1))
  771.                     FOR Temp = 1 TO Num
  772.                         READ A$
  773.                         HighWhere = INSTR(A$, Carrot$)
  774.                         IF HighWhere > 0 THEN
  775.                     IF Let2Scan(ASC(MID$(A$, HighWhere + 1))) = Dummy THEN
  776.                                 Cursor = Temp
  777.                                 Found = True
  778.                                 EXIT FOR
  779.                             END IF
  780.                         END IF
  781.                     NEXT
  782.                 ELSEIF Alt OR ((NOT Alt) AND (State = Released)) THEN 'len=1
  783.                     Dummy = ASC(UCASE$(In$))
  784.  
  785.                     DrawTop Search, Dummy
  786.                     IF Dummy > 0 THEN
  787.                         Found = True
  788.                         Cursor = Dummy
  789.                     END IF
  790.                 END IF
  791.  
  792.                 IF Found THEN
  793.                     GOSUB ActSub
  794.                 ELSE
  795.                     IF (State = Closed) OR (State = Pressed) THEN
  796.                         IF Alt THEN
  797.                             FalseAlt = True
  798.                         END IF
  799.  
  800.                         EXIT DO
  801.                     ELSE
  802.                         Alarm
  803.                     END IF
  804.                 END IF
  805.         END SELECT
  806.     LOOP
  807.  
  808.     Main$ = K$
  809.     IF State <> Closed THEN DrawTop Closed, 0
  810. EXIT FUNCTION
  811.  
  812. ActSub:
  813.     Dummy$ = "": OldSta = Opened: State = Opened
  814.  
  815.     DO
  816.         DrawTop Opened, Cursor
  817.  
  818. ' ===================================================================
  819. ' Here is the place that you edit to change what the menu choices
  820. ' do.  All you have to do is change everything inside the
  821. ' "SELECT CASE Dummy."  Do not change anything else.
  822. ' You may add identical procedures for every menu (like one for
  823. ' Search or Options, etc.)
  824. ' ===================================================================
  825.         SELECT CASE Cursor
  826.             CASE 1
  827.                 RESTORE FileDATA
  828.                 Dummy$ = GetSubM
  829.  
  830.                 IF ASC(Dummy$) = 0 THEN
  831.                     ClearBot
  832.                     Dummy = ASC(RIGHT$(Dummy$, 1))
  833.                     SELECT CASE Dummy
  834. ' =================================================================
  835. ' This is MENU 1.  Put a CASE {number} for every menu choice.
  836. ' CASE 1 is the first menu choice; CASE 2 is the second... etc.
  837. ' Separator bars do not count.
  838. ' =================================================================
  839.                         CASE 6
  840.                             Main$ = Null$
  841.                             EXIT FUNCTION
  842.                         CASE ELSE
  843.                             Info "You picked Menu 1 Option" + STR$(Dummy), ""
  844.                     END SELECT
  845.                 END IF
  846.             CASE 2
  847.                 RESTORE EditDATA
  848.                 Dummy$ = GetSubM
  849.  
  850.                 IF ASC(Dummy$) = 0 THEN
  851.                     ClearBot
  852.                     Dummy = ASC(RIGHT$(Dummy$, 1))
  853.                     SELECT CASE Dummy
  854. ' =================================================================
  855. ' This is MENU 2.  Put a CASE {number} for every menu choice.
  856. ' CASE 1 is the first menu choice; CASE 2 is the second... etc.
  857. ' Separator bars do not count.
  858. ' =================================================================
  859.                         CASE ELSE
  860.                             Info "You picked Menu 2 Option" + STR$(Dummy), ""
  861.                     END SELECT
  862.                 END IF
  863.             CASE 3
  864.                 RESTORE OptionDATA
  865.                 Dummy$ = GetSubM
  866.  
  867.                 IF ASC(Dummy$) = 0 THEN
  868.                     ClearBot
  869.                     Dummy = ASC(RIGHT$(Dummy$, 1))
  870.                     SELECT CASE Dummy
  871. ' =================================================================
  872. ' This is MENU 3.  Put a CASE {number} for every menu choice.
  873. ' CASE 1 is the first menu choice; CASE 2 is the second... etc.
  874. ' Separator bars do not count.
  875. ' =================================================================
  876.                         CASE 1, 2, 3, 5
  877.                             FlipTog Dummy + (Dummy = 5)
  878.                             Info "Flipping toggle!", "Go see for yourself!"
  879.                         CASE ELSE
  880.                             Info "You picked Menu 3 Option" + STR$(Dummy), ""
  881.                     END SELECT
  882.                 END IF
  883.  
  884.             CASE 4
  885.                 RESTORE HelpDATA
  886.                 Dummy$ = GetSubM
  887.  
  888.                 IF ASC(Dummy$) = 0 THEN
  889.                     Dummy = ASC(RIGHT$(Dummy$, 1))
  890.                     ClearBot
  891.                     SELECT CASE Dummy
  892. ' =================================================================
  893. ' This is MENU 4.  Put a CASE {number} for every menu choice.
  894. ' CASE 1 is the first menu choice; CASE 2 is the second... etc.
  895. ' Separator bars do not count.
  896. ' =================================================================
  897.                         CASE 2
  898.                             Info "I've fallen, and I CAN'T get up!!!", ""
  899.                         CASE 3
  900.                             Info "QBMenu! 1.0 ■ Add-in Library", "(C) Copyright Victor Yiu, 1993."
  901.                         CASE ELSE
  902.                             Info "You picked Menu 4 Option" + STR$(Dummy), ""
  903.                     END SELECT
  904.                 END IF
  905.         END SELECT
  906.  
  907.         SELECT CASE ASC(Dummy$)
  908.             CASE 62    ' ">"
  909.                 Cursor = Cursor + 1
  910.                 IF Cursor > MainMChoices THEN Cursor = 1
  911.             CASE 60     ' "<"
  912.                 Cursor = Cursor - 1
  913.                 IF Cursor < 1 THEN Cursor = MainMChoices
  914.             CASE ELSE
  915.                 EXIT DO
  916.         END SELECT
  917.     LOOP
  918.  
  919.     IF Dummy$ <> Escape$ THEN
  920.         State = Closed
  921.         Hold = AltOn
  922.     ELSE
  923.         State = Released
  924.     END IF
  925. RETURN
  926.  
  927. END FUNCTION
  928.  
  929. SUB Ok (X, Y, FCol, BCol, JustDraw, Help25)
  930.  
  931.     LOCATE , , 0
  932.     IF JustDraw <> Closed THEN
  933.         Dummy = Snatch(Saved(), X, Y, X + 2, Y + 5, Save)
  934.  
  935.         COLOR FCol, BCol
  936.         GOSUB DrawOkBox
  937.         IF (FCol <= 7) AND (BCol = 0) AND (NOT ColorM) THEN COLOR FCol + 7
  938.         GOSUB DrawOk
  939.  
  940.         IF Help25 THEN
  941.             Dummy = Snatch(Saved(), 25, 1, 25, 80, Save)
  942.             ClearBot
  943.             'IF ColorM THEN COLOR 15, 3 ELSE COLOR 0, 15
  944.             Center 25, "Press a key to continue"
  945.         END IF
  946.         IF JustDraw = Opened THEN EXIT SUB
  947.  
  948.         DO: Clock: LOOP UNTIL LEN(INKEY$)
  949.         IF Help25 THEN
  950.             ClearBot
  951.             Dummy = Snatch(Saved(), 0, 0, 0, 0, Rest)
  952.         END IF
  953.     END IF
  954.  
  955.     COLOR BCol, FCol
  956.     GOSUB DrawOkBox
  957.     IF (BCol <= 7) AND (FCol = 0) AND (NOT ColorM) THEN COLOR BCol + 7, FCol
  958.     GOSUB DrawOk
  959.  
  960.     WaitFor 3
  961.     Dummy = Snatch(Saved(), 0, 0, 0, 0, Rest)
  962.     WaitFor 3
  963. EXIT SUB
  964.  
  965. DrawOkBox:
  966.     DrawBox X, Y, X + 2, Y + 5, 1, 32, 0
  967. RETURN
  968.  
  969. DrawOk:
  970.     LOCATE X + 1, Y + 2
  971.     PRINT "Ok";
  972. RETURN
  973.  
  974. END SUB
  975.  
  976. SUB ShowLogo (Offset)
  977. SHARED Logo$
  978.  
  979. COLOR 7, bBG
  980. FOR Temp = 3 TO 15
  981.     LOCATE Temp, 5
  982.     PRINT MID$(Logo$, Offset + Temp, 70);
  983. NEXT
  984.  
  985. END SUB
  986.  
  987. SUB WaitFor (Leng)
  988.  
  989. T! = TIMER
  990. DO: LOOP UNTIL (TIMER - T!) > (Leng / 18) OR (TIMER < T!)
  991.  
  992. END SUB
  993.  
  994.